﻿using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Util;
using System;
using System.ComponentModel;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Orm.DataEntity;
using System.Data;
using Kingdee.BOS.App.Core;


namespace LiMinCRMPlugin
{
    /// <summary>
    /// 物料提交插件
    /// </summary>
    /// <remarks>
    /// 功能：物料在集团创建提交后根据销售单位与辅单位的换算比例赋值到对应字段(如果销售单位与基本单位不一致，需要通过基本单位做换算)。
    /// 创建人：wzx
    /// 创建日期：2024.7.18
    /// 修改信息（1）：修改人，修改日期，修改内容
    /// </remarks>
    [Description("物料提交计算销售单位换算件")]
    [HotUpdate]
    public class MaterialSubmit : AbstractOperationServicePlugIn
    {
        //OnPreparePropertys 数据加载前，确保需要的属性被加载
        public override void OnPreparePropertys(PreparePropertysEventArgs e)
        {
            base.OnPreparePropertys(e);
            //存货类别
            e.FieldKeys.Add("FCategoryID");
            //物料编码
            e.FieldKeys.Add("FNumber");
            //物料名称
            e.FieldKeys.Add("FName");
            //物料分组
            e.FieldKeys.Add("FMaterialGroup");
            //规格型号
            e.FieldKeys.Add("FSpecification");
            //描述
            e.FieldKeys.Add("FDescription");
            //物料属性
            e.FieldKeys.Add("FErpClsID");


            //基本单位
            e.FieldKeys.Add("FBaseUnitId");
            //库存单位
            e.FieldKeys.Add("FStoreUnitID");

            //保质期
            e.FieldKeys.Add("FEXPPERIOD");

            //启用批号管理
            e.FieldKeys.Add("FISBATCHMANAGE");
            //启用库存管理
            e.FieldKeys.Add("FISSNMANAGE");

            //使用组织
            e.FieldKeys.Add("FUseOrgId");

            //同步CRM状态
            e.FieldKeys.Add("F_DEV_FSTATUS");
            //默认税率
            e.FieldKeys.Add("FTaxRateId");
            //税收分类
            e.FieldKeys.Add("FTaxCategoryCodeId");
            //销售单位
            e.FieldKeys.Add("FSaleUnitId");
            //销售单位换算率分子
            e.FieldKeys.Add("FSaleURNum");
            //销售单位换算率分母
            e.FieldKeys.Add("FSaleURNom");
            //销售计价单位
            e.FieldKeys.Add("FSalePriceUnitId");
            //销售计价单位换算率分子
            e.FieldKeys.Add("FSalePriceURNum");
            //销售计价单位换算率分母
            e.FieldKeys.Add("FSalePriceURNom");
            //产品经理
            e.FieldKeys.Add("F_SVZW_Assistant_qtr_apv");
            //创建组织 
            e.FieldKeys.Add("FCreateOrgId");
            //禁用人 
            e.FieldKeys.Add("FForbidderId");
            //禁用日期 
            e.FieldKeys.Add("FForbidDate");
            //禁用状态 
            e.FieldKeys.Add("FForbidStatus");
            //制造策略 
            e.FieldKeys.Add("FMfgPolicyId");
            //加工 
            e.FieldKeys.Add("F_SVZW_Text_qtr");
            //包材 
            e.FieldKeys.Add("F_SVZW_Text_qtr_83g");
            //包装型号 
            e.FieldKeys.Add("F_SVZW_Text_qtr_83g_re5");
            //商品名 
            e.FieldKeys.Add("F_SVZW_Text_qtr_83g_w5c1");
            //含量
            e.FieldKeys.Add("F_SVZW_Text_qtr_83g_uky");
            //成品颜色
            e.FieldKeys.Add("F_SVZW_Text_qtr_83g_tzk");
            //有效成分
            e.FieldKeys.Add("F_SVZW_Text_qtr_83g_ca9");
            //渠道品牌
            e.FieldKeys.Add("F_SVZW_Text_qtr_83g_h1g");
            //是否定制
            e.FieldKeys.Add("F_RDLV_Combo_qtr1");
            //最小包装
            e.FieldKeys.Add("F_SVZW_Text_qtr_83g_dvn");
            //产品性质
            e.FieldKeys.Add("F_SVZW_Combo_yrr");
            //产品登记证
            e.FieldKeys.Add("F_RDLV_Assistant_ca9");
            //登记号到期日期
            e.FieldKeys.Add("F_SVZW_DateTime_43c");
            //生产批准证号
            e.FieldKeys.Add("F_SVZW_Text_zc5_ne1");
            //批准证到期日期
            e.FieldKeys.Add("F_SVZW_DateTime_43c_6oq");
            //标准证号
            e.FieldKeys.Add("F_SVZW_Text_zc5_ne1_pzg");
            //标准证到期日期
            e.FieldKeys.Add("F_SVZW_DateTime_43c_9uj");
            //产品品类
            e.FieldKeys.Add("F_SVZW_Assistant_qtr");
            //产品类别
            e.FieldKeys.Add("F_SVZW_Assistant_83g");
            //包材类型
            e.FieldKeys.Add("F_SVZW_Assistant_qtr_re5");
            //淡储类型
            e.FieldKeys.Add("F_SVZW_Assistant_qtr_tzk");
            //剂型
            e.FieldKeys.Add("F_SVZW_Assistant_qtr_ca9");
            //商标名称
            e.FieldKeys.Add("F_SVZW_Assistant_qtr_uky");
            //生产类型
            e.FieldKeys.Add("F_SVZW_Assistant_qtr_dvn");
            //开票名称
            e.FieldKeys.Add("F_RDLV_Text_1xj");
            //开票单位
            e.FieldKeys.Add("F_RDLV_Base_3iy");
            //开票规格型号
            e.FieldKeys.Add("F_RDLV_Text_k79");


            //单件销售单位数量
            e.FieldKeys.Add("F_QLTK_Qty_qtr");
            //创建人
            e.FieldKeys.Add("FCreatorId");



        }
        public override void EndOperationTransaction(EndOperationTransactionArgs e)
        {
            int successNum = 0;//记录成功数
            base.EndOperationTransaction(e);
            string InvokeType = "";
            if (this.FormOperation.Operation.ToUpper() == "AUDIT")
            {
                InvokeType = "物料审核自动上传CRM";
            }
            else if (this.FormOperation.Operation.ToUpper() == "REUPLOADMATERIAL")
            {
                InvokeType = "物料手工上传CRM";
            }
            //读取全部的单据,for循环,转换成DynamicObject类型
            foreach (DynamicObject entity in e.DataEntitys)
            {
                string UserAccount = "";//用户账号
                DynamicObject User = entity["CreatorId"] as DynamicObject;//用户
                if (User != null)
                {
                    UserAccount = Convert.ToString(User["UserAccount"]);
                }

                string FID = Convert.ToString(entity["Id"]);//物料内码                      
                string Number = entity["Number"].ToString();//物料编码      
                string Name = entity["Name"].ToString();//物料名称
                string MASTERID = "";
                string sqlM = @"/*dialect*/select FMASTERID from T_BD_MATERIAL
where FMATERIALID='" + FID + "'";
                DataTable dtM = DBUtils.ExecuteDataSet(this.Context, sqlM).Tables[0];
                if (dtM != null&&dtM.Rows.Count>0) 
                {
                    MASTERID = Convert.ToString(dtM.Rows[0]["FMASTERID"]);
                }
                DynamicObject CreateOrg = entity["CreateOrgId"] as DynamicObject;//创建组织
                string CreateOrgId = "";//创建组织内码
                string CreateOrgNo = "";//创建组织编码
                string CreateOrgName = "";
                if (CreateOrg != null)
                {
                    CreateOrgId = Convert.ToString(CreateOrg["ID"]);//创建组织内码
                    CreateOrgNo = Convert.ToString(CreateOrg["Number"]);//创建组织编码
                    CreateOrgName = Convert.ToString(CreateOrg["Name"]);//创建组织名称
                }


                DynamicObject UseOrg = entity["UseOrgId"] as DynamicObject;//使用组织
                string UseOrgId = "";//使用组织内码
                string UseOrgNo = "";//使用组织编码
                string UseOrgName = "";
                if (UseOrg != null)
                {
                    UseOrgId = Convert.ToString(UseOrg["ID"]);//使用组织内码
                    UseOrgNo = Convert.ToString(UseOrg["Number"]);//使用组织编码
                    UseOrgName = Convert.ToString(UseOrg["Name"]);//组织名称
                }
            

  
                #region 基本信息
                var MaterialBase = entity["MaterialBase"] as DynamicObjectCollection;//基本信息

                string BaseUnitId = "";//基本单位内码 
                string BaseUnitNo = "";//基本单位编码
                string BaseUnitName = "";//基本单位名称
                string materialTypeName = "";//物料属性对应枚举值名称
                string TaxRateNumber = "";//默认税率
                int TaxRate = 0;//税率
                string TaxCategoryCodeNumber = "";//税收分类编码
                string TaxCategoryCodeName = "";//税收分类名称
                string CategoryNo = "";
                if (MaterialBase != null && MaterialBase.Count > 0)
                {
                    var materialType = MaterialBase[0]["ErpClsID"].ToString();//物料属性

                    string sqlErpClsID = @"/*dialect*/ select FCAPTION from T_META_FORMENUMITEM_L a
 inner join T_META_FORMENUMITEM b on a.FENUMID=b.FENUMID
 inner join T_meta_formenum d on b.FID=d.FID
  inner join T_META_FORMENUM_L c on c.FID=d.FID
 where c.FNAME='BD_物料属性' and b.FVALUE='" + materialType + "'";
                    DataTable dtErpClsID = DBUtils.ExecuteDataSet(this.Context, sqlErpClsID).Tables[0];
                    if (dtErpClsID.Rows.Count > 0)
                    {
                        materialTypeName = dtErpClsID.Rows[0]["FCAPTION"].ToString();
                    }
                    DynamicObject BaseUnit = MaterialBase[0]["BaseUnitId"] as DynamicObject;//基本单位
                    if (BaseUnit != null)
                    {
                        BaseUnitId = BaseUnit["ID"].ToString();//基本单位内码 
                        BaseUnitNo = BaseUnit["Number"].ToString();//基本单位编码
                        BaseUnitName = BaseUnit["Name"].ToString();//基本单位名称
                    }
  

                    DynamicObject Category = MaterialBase[0]["CategoryID"] as DynamicObject;//存货类别

                    if (Category != null)
                    {
                        CategoryNo = Convert.ToString(Category["Number"]);
                    }
                }
                #endregion


                #region 库存信息
                var MaterialStock = entity["MaterialStock"] as DynamicObjectCollection;//库存信息
                string FEXPPERIOD = ""; //保质期
                string FISBATCHMANAGE = ""; //启用批号管理
                string FISSNMANAGE = "";
                string StoreUnitNumber = "";//库存单位编码
                string AuxUnitIDNumber = "";//辅助单位编码
                string AuxUnitID = "";//辅助单位内码
                if (MaterialStock != null && MaterialStock.Count > 0)
                {
                    FEXPPERIOD = MaterialStock[0]["EXPPERIOD"].ToString(); //保质期
                    FISBATCHMANAGE = MaterialStock[0]["ISBATCHMANAGE"].ToString(); //启用批号管理
                    FISSNMANAGE = MaterialStock[0]["ISSNMANAGE"].ToString(); //启用库存管理
                    DynamicObject StoreUnit = MaterialStock[0]["StoreUnitID"] as DynamicObject;//库存单位
                    if (StoreUnit != null)
                    {
                        StoreUnitNumber = StoreUnit["Number"].ToString();//库存单位编码                            
                    }
                    DynamicObject AuxUnit = MaterialStock[0]["AuxUnitID"] as DynamicObject;//辅助单位
                    if (AuxUnit != null)
                    {
                        AuxUnitIDNumber = AuxUnit["Number"].ToString();//辅助单位编码
                        AuxUnitID = AuxUnit["ID"].ToString();//辅助单位内码
                    }
                }

                bool ISBATCHMANAGE;//是否启用批号管理
                if (FISBATCHMANAGE.ToUpper() == "TRUE")
                {
                    ISBATCHMANAGE = true;
                }
                else
                {
                    ISBATCHMANAGE = false;
                }

                bool ISSNMANAGE;//是否启用库存管理
                if (FISSNMANAGE.ToUpper() == "TRUE")
                {
                    ISSNMANAGE = true;
                }
                else
                {
                    ISSNMANAGE = false;
                }
                #endregion


                #region 销售信息
                var MaterialSale = entity["MaterialSale"] as DynamicObjectCollection;//销售信息
                string SaleUnitNumber = "";//销售单位
                string SaleUnitID = "";//销售单位内码
                string xsdwhssl = "";//销售单位换算量
                string SalePriceUnitNumber = "";//销售计价单位
                string xsjjdwhssl = "";//销售计价单位换算量
                if (MaterialSale != null && MaterialSale.Count > 0)
                {
                    DynamicObject SaleUnit = MaterialSale[0]["SaleUnitId"] as DynamicObject;//销售单位
                    if (SaleUnit != null)
                    {
                        SaleUnitNumber = SaleUnit["Number"].ToString();//销售单位编码
                        SaleUnitID = SaleUnit["ID"].ToString();//销售单位内码
                    }
                    xsdwhssl = ((decimal)MaterialSale[0]["SaleURNum"] / (decimal)MaterialSale[0]["SaleURNom"]).ToString();
                    DynamicObject TaxCategoryCode = MaterialSale[0]["TaxCategoryCodeId"] as DynamicObject;//税收分类
                    if (TaxCategoryCode != null)
                    {
                        TaxCategoryCodeNumber = TaxCategoryCode["Number"].ToString();// 税收分类编码
                        TaxCategoryCodeName = TaxCategoryCode["Name"].ToString();//税收分类名称
                    }
                    DynamicObject SalePriceUnit = MaterialSale[0]["SalePriceUnitId"] as DynamicObject;//销售计价单位
                    if (SalePriceUnit != null)
                    {
                        SalePriceUnitNumber = SalePriceUnit["Number"].ToString();//销售计价单位编码                            
                    }
                    xsjjdwhssl = ((decimal)MaterialSale[0]["SalePriceURNum"] / (decimal)MaterialSale[0]["SalePriceURNom"]).ToString();
                }
                #endregion


                decimal PieceConversion = 0;//单件销售单位数量
                PieceConversion = Convert.ToDecimal(entity["F_QLTK_Qty_qtr"]);
                decimal AuxUnitCONVERTRATE = 0;//辅单位与基本单位换算率
                decimal SaleUnitCONVERTRATE = 0;//销售单位与基本单位换算率
                decimal AuxConvertToSale = 0;//辅单位件与销售单位换算率
                if (AuxUnitIDNumber=="件")//
                {
                    if (BaseUnitNo != SaleUnitNumber)//销售单位与基本单位不一致
                    {
                        //辅单位换算(1辅助单位=X基本单位)
                        string sqlAuxUnitCONVERTRATE = @"/*dialect*/ select FConvertDenominator ,FConvertNumerator  from T_BD_UNITCONVERTRATE
where FMASTERID='"+MASTERID+"' and FCurrentUnitId='"+ AuxUnitID + "' and FDestUnitId='"+ BaseUnitId + "'";
                        DataTable dtAuxUnitCONVERTRATE = DBUtils.ExecuteDataSet(this.Context, sqlAuxUnitCONVERTRATE).Tables[0];
                        if (dtAuxUnitCONVERTRATE.Rows.Count > 0)
                        {
                            AuxUnitCONVERTRATE =Convert.ToDecimal(dtAuxUnitCONVERTRATE.Rows[0]["FConvertNumerator"])/ Convert.ToDecimal(dtAuxUnitCONVERTRATE.Rows[0]["FConvertDenominator"]);
                        }
                        //销售单位换算
                        string sqlSaleUnitCONVERTRATE = @"/*dialect*/ select FConvertDenominator ,FConvertNumerator  from T_BD_UNITCONVERTRATE
where FMASTERID='" + MASTERID + "' and FCurrentUnitId='" + SaleUnitID + "' and FDestUnitId='" + BaseUnitId + "'";
                        DataTable dtSaleUnitCONVERTRATE = DBUtils.ExecuteDataSet(this.Context, sqlSaleUnitCONVERTRATE).Tables[0];
                        if (dtSaleUnitCONVERTRATE.Rows.Count > 0)
                        {
                            SaleUnitCONVERTRATE = Convert.ToDecimal(dtSaleUnitCONVERTRATE.Rows[0]["FConvertDenominator"]) / Convert.ToDecimal(dtSaleUnitCONVERTRATE.Rows[0]["FConvertNumerator"]);
                        }
                        AuxConvertToSale = AuxUnitCONVERTRATE * SaleUnitCONVERTRATE;
                    }
                    else//销售单位=基本单位
                    {
                        //辅单位换算
                        string sqlAuxUnitCONVERTRATE = @"/*dialect*/ select FConvertDenominator ,FConvertNumerator  from T_BD_UNITCONVERTRATE
where FMASTERID='" + MASTERID + "' and FCurrentUnitId='" + AuxUnitID + "' and FDestUnitId='" + BaseUnitId + "'";
                        DataTable dtAuxUnitCONVERTRATE = DBUtils.ExecuteDataSet(this.Context, sqlAuxUnitCONVERTRATE).Tables[0];
                        if (dtAuxUnitCONVERTRATE.Rows.Count > 0)
                        {
                            AuxUnitCONVERTRATE = Convert.ToDecimal(dtAuxUnitCONVERTRATE.Rows[0]["FConvertNumerator"]) / Convert.ToDecimal(dtAuxUnitCONVERTRATE.Rows[0]["FConvertDenominator"]);
                        }
                        AuxConvertToSale = AuxUnitCONVERTRATE ;
                    }
                    entity["F_QLTK_Qty_qtr"] = AuxConvertToSale;
                    new BusinessDataWriter(this.Context).Save(e.DataEntitys);

                }
            }

        }
    }
}
